<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <title>鼠标绘制多线</title>
    <style>
        body {
            margin: 0;
            overflow: hidden;
        }

        #canvas {
            background-color: antiquewhite;
        }
    </style>
</head>

<body>
<canvas id="canvas"></canvas>
<!-- 顶点着色器 -->
<script id="vertexShader" type="x-shader/x-vertex">
      attribute vec4 a_Position;
      void main(){
          gl_Position=a_Position;
          gl_PointSize=20.0;
      }
    </script>
<!-- 片元着色器 -->
<script id="fragmentShader" type="x-shader/x-fragment">
      precision mediump float;
      uniform vec4 u_FragColor;
      void main(){
        float dist=distance(gl_PointCoord,vec2(0.5,0.5));
        if(dist<0.5){
          gl_FragColor=vec4(1,1,0,1);
        }else{
          discard;
        }
      }
    </script>
<script type="module">
  import { initShaders, getMousePosInWebgl } from "../jsm/Utils.js";
  import Poly from '../jsm/Poly.js';
  import Sky from '../jsm/Sky.js';

  const canvas = document.querySelector("#canvas");
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;

  // 获取着色器文本
  const vsSource = document.querySelector("#vertexShader").innerText;
  const fsSource = document.querySelector("#fragmentShader").innerText;

  //三维画笔
  const gl = canvas.getContext("webgl");

  //初始化着色器
  initShaders(gl, vsSource, fsSource);


  //声明颜色 rgba
  gl.clearColor(0, 0, 0, 1);
  //刷底色
  gl.clear(gl.COLOR_BUFFER_BIT);

  //夜空
  const sky = new Sky(gl)
  //正在绘制的多边形
  let poly = null

  canvas.oncontextmenu = function () {
    return false
  }

  canvas.addEventListener('mousedown', (event) => {
    if (event.button === 2) {
      popVertice()
    } else {
      const { x, y } = getMousePosInWebgl(event, canvas)
      if (poly) {
        poly.addVertice(x, y)
      } else {
        crtPoly(x, y)
      }
    }
    render()
  })

  canvas.addEventListener('mousemove', (event) => {
    if (poly) {
      const { x, y } = getMousePosInWebgl(event, canvas)
      poly.setVertice(poly.count - 1, x, y)
      render()
    }
  })

  function crtPoly(x, y) {
    poly = new Poly({
      vertices: [x, y, x, y],
      types: ['POINTS', 'LINE_STRIP']
    })
    sky.add(poly)
  }

  function popVertice() {
    poly.popVertice()
    poly = null
  }

  function render() {
    gl.clear(gl.COLOR_BUFFER_BIT);
    sky.draw()
  }

</script>
</body>

</html>
